//hdu 3673 可修改堆模板
const int maxv = 1100010;
struct node
{
	int a,num,time;
	node(){}
	node(int aa,int bb,int cc)
	{	a=aa; num=bb; time=cc;}
}a[maxv];
//堆的比较，返回true的排在堆的越上层
template <class T,int maxv>//传入堆里面元素的类型，堆中原数组的下标总共大小
struct heap
{
	T *ar;//自己赋值
	int sz;//特别注意下面两个数组的大小,invto的大小超界没
	int to[maxv+10];//注意元素组不能样用0下标,堆中的第i个元素在原数组的下标
	int invto[maxv+10];//原数组的第i个下标在堆中的下标
	
	inline bool cmp(const T &x, const T &y)//注意每次自己写比较函数
	{
		if(x.num==y.num)
			return x.time<y.time;
		return x.num>y.num;
	}
	inline void clear()//应该是只用 sz赋值为0就可以清空堆
	{
		sz=0;
	}
	inline void swapnow(int a, int b)
	{
		int tp=to[a]; 
		to[a]=to[b]; 
		to[b]=tp; 
		invto[to[a]]=a; 
		invto[to[b]]=b;
	}
	
	inline void init(T *a, int vn = 0)//传入原数组和大小建堆（也可以不对插入建）
	{
		ar = a;
		sz = vn;
		for (int i = 1; i <= sz; ++i)
		{
			to[i] = i;
			invto[i] = i;
		}
		for (int i = sz>>1; i >= 1; --i)
			sink(i);
	}

	void sink(int i)
	{
		int l, r, minn;
		while (l = i<<1, r = (i<<1)+1, l <= sz)
		{
			minn = i;
			if (l<=sz && cmp(ar[to[l]], ar[to[minn]]))
				minn = l;
			if (r<=sz && cmp(ar[to[r]], ar[to[minn]]))
				minn = r;
			if (minn == i) break;
			swapnow(i, minn);
			i = minn;
		}
	}

	void rise(int i)
	{
		int P;
		while (i > 1)
		{
			P = i >> 1;
			if (cmp(ar[to[P]], ar[to[i]])) break;
			swapnow(i, P);
			i = P;
		}
	}
	void insert(int i)//原数组的第i个元素的下标放入堆
	{
		to[++sz] = i;
		invto[i] = sz;
		rise(sz);
	}
	void del(int i)//传入原数组的第i个元素的下标
	{
		int n = invto[i];
		swapnow(n, sz--);
		sink(n);
		rise(n);
	}
	void pop()
	{
		//if (sz < 1) throw "ERR: Heapsz == 0!"
		//else
		del(to[1]);
	}
	void modify(int i, T x)//原数组下标为i的值改为x
	{
		ar[i] = x;
		sink(invto[i]);
		rise(invto[i]);
	}
	int topid()//取得堆顶元素在原数组中的下标
	{
		//if (sz < 1) throw "ERR: Heapsz == 0!"
		//else
		return to[1];
	}

	T& top()//取堆顶元素
	{
		//if (sz < 1) throw "ERR: Heapsz == 0!"
		//else
		return ar[to[1]];
	}
};
heap<node,1100010> hp;
int n,m;
int main()
{
	//freopen("in","r",stdin);
	int i,j,k,cas=0;
	while(scanf("%d%d",&m,&n),n||m)
	{
		int x,y,tp;
		clr(a,0);
		hp.clear();
		hp.ar=a;
		int ans=0;
		for(i=1; i<=n; i++)
		{
			x=rd();
			if(a[x].a==0)
			{
				if(hp.sz==m)
				{
					hp.top().a=0;
					hp.pop();
					ans++;
				}
				a[x].a=1;
				a[x].num=1;
				a[x].time=i;
				hp.insert(x);
			}
			else
			{
				node now=a[x];
				now.num++;
				hp.modify(x,now);
			}
		}
		printf("Case %d: %d\n",++cas,ans);
	}
}

